1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#include <assert.h>
16#include <inttypes.h>
17#include <limits.h>
18#include <math.h>
19#include <stdio.h>
20#include <stdlib.h>
21#include <string.h>
22
23#include <memory>
24
25#include "config/aom_config.h"
26
27#if CONFIG_AV1_DECODER
29#endif
32#include "aom/aom_integer.h"
34#include "aom_dsp/bitwriter_buffer.h"
35#include "aom_ports/aom_timer.h"
36#include "av1/ratectrl_rtc.h"
37#include "common/args.h"
38#include "common/tools_common.h"
39#include "common/video_writer.h"
40#include "examples/encoder_util.h"
41#include "examples/multilayer_metadata.h"
42
43#define OPTION_BUFFER_SIZE 1024
44#define MAX_NUM_SPATIAL_LAYERS 4
45
46typedef struct {
47 const char *output_filename;
48 char options[OPTION_BUFFER_SIZE];
49 struct AvxInputContext input_ctx[MAX_NUM_SPATIAL_LAYERS];
50 int speed;
51 int aq_mode;
52 int layering_mode;
53 int output_obu;
54 int decode;
55 int tune_content;
56 int show_psnr;
57 bool use_external_rc;
58 bool scale_factors_explicitly_set;
59 const char *multilayer_metadata_file;
60} AppInput;
61
62typedef enum {
63 QUANTIZER = 0,
64 BITRATE,
65 SCALE_FACTOR,
66 AUTO_ALT_REF,
67 ALL_OPTION_TYPES
68} LAYER_OPTION_TYPE;
69
70static const arg_def_t outputfile =
71 ARG_DEF("o", "output", 1, "Output filename");
72static const arg_def_t frames_arg =
73 ARG_DEF("f", "frames", 1, "Number of frames to encode");
74static const arg_def_t threads_arg =
75 ARG_DEF("th", "threads", 1, "Number of threads to use");
76static const arg_def_t width_arg = ARG_DEF("w", "width", 1, "Source width");
77static const arg_def_t height_arg = ARG_DEF("h", "height", 1, "Source height");
78static const arg_def_t timebase_arg =
79 ARG_DEF("t", "timebase", 1, "Timebase (num/den)");
80static const arg_def_t bitrate_arg = ARG_DEF(
81 "b", "target-bitrate", 1, "Encoding bitrate, in kilobits per second");
82static const arg_def_t spatial_layers_arg =
83 ARG_DEF("sl", "spatial-layers", 1, "Number of spatial SVC layers");
84static const arg_def_t temporal_layers_arg =
85 ARG_DEF("tl", "temporal-layers", 1, "Number of temporal SVC layers");
86static const arg_def_t layering_mode_arg =
87 ARG_DEF("lm", "layering-mode", 1, "Temporal layering scheme.");
88static const arg_def_t kf_dist_arg =
89 ARG_DEF("k", "kf-dist", 1, "Number of frames between keyframes");
90static const arg_def_t scale_factors_arg =
91 ARG_DEF("r", "scale-factors", 1, "Scale factors (lowest to highest layer)");
92static const arg_def_t min_q_arg =
93 ARG_DEF(NULL, "min-q", 1, "Minimum quantizer");
94static const arg_def_t max_q_arg =
95 ARG_DEF(NULL, "max-q", 1, "Maximum quantizer");
96static const arg_def_t speed_arg =
97 ARG_DEF("sp", "speed", 1, "Speed configuration");
98static const arg_def_t aqmode_arg =
99 ARG_DEF("aq", "aqmode", 1, "AQ mode off/on");
100static const arg_def_t bitrates_arg =
101 ARG_DEF("bl", "bitrates", 1,
102 "Bitrates[spatial_layer * num_temporal_layer + temporal_layer]");
103static const arg_def_t dropframe_thresh_arg =
104 ARG_DEF(NULL, "drop-frame", 1, "Temporal resampling threshold (buf %)");
105static const arg_def_t error_resilient_arg =
106 ARG_DEF(NULL, "error-resilient", 1, "Error resilient flag");
107static const arg_def_t output_obu_arg =
108 ARG_DEF(NULL, "output-obu", 1,
109 "Write OBUs when set to 1. Otherwise write IVF files.");
110static const arg_def_t test_decode_arg =
111 ARG_DEF(NULL, "test-decode", 1,
112 "Attempt to test decoding the output when set to 1. Default is 1.");
113static const arg_def_t psnr_arg =
114 ARG_DEF(NULL, "psnr", -1, "Show PSNR in status line.");
115static const arg_def_t ext_rc_arg =
116 ARG_DEF(NULL, "use-ext-rc", 0, "Use external rate control.");
117static const struct arg_enum_list tune_content_enum[] = {
118 { "default", AOM_CONTENT_DEFAULT },
119 { "screen", AOM_CONTENT_SCREEN },
120 { "film", AOM_CONTENT_FILM },
121 { NULL, 0 }
122};
123static const arg_def_t tune_content_arg = ARG_DEF_ENUM(
124 NULL, "tune-content", 1, "Tune content type", tune_content_enum);
125#if CONFIG_CWG_E050
126static const arg_def_t multilayer_metadata_file_arg =
127 ARG_DEF("ml", "multilayer_metadata_file", 1,
128 "Experimental: path to multilayer metadata file");
129#endif
130
131#if CONFIG_AV1_HIGHBITDEPTH
132static const struct arg_enum_list bitdepth_enum[] = { {
"8",
AOM_BITS_8 },
134 { NULL, 0 } };
135
136static const arg_def_t bitdepth_arg = ARG_DEF_ENUM(
137 "d", "bit-depth", 1, "Bit depth for codec 8 or 10. ", bitdepth_enum);
138#endif
139
140static const arg_def_t *svc_args[] = {
141 &frames_arg,
142 &outputfile,
143 &width_arg,
144 &height_arg,
145 &timebase_arg,
146 &bitrate_arg,
147 &spatial_layers_arg,
148 &kf_dist_arg,
149 &scale_factors_arg,
150 &min_q_arg,
151 &max_q_arg,
152 &temporal_layers_arg,
153 &layering_mode_arg,
154 &threads_arg,
155 &aqmode_arg,
156#if CONFIG_AV1_HIGHBITDEPTH
157 &bitdepth_arg,
158#endif
159 &speed_arg,
160 &bitrates_arg,
161 &dropframe_thresh_arg,
162 &error_resilient_arg,
163 &output_obu_arg,
164 &test_decode_arg,
165 &tune_content_arg,
166 &psnr_arg,
167#if CONFIG_CWG_E050
168 &multilayer_metadata_file_arg,
169#endif
170 NULL,
171};
172
173#define zero(Dest) memset(&(Dest), 0, sizeof(Dest))
174
175static const char *exec_name;
176
177void usage_exit(void) {
178 fprintf(stderr,
179 "Usage: %s <options> input_filename [input_filename ...] -o "
180 "output_filename\n",
181 exec_name);
182 fprintf(stderr, "Options:\n");
183 arg_show_usage(stderr, svc_args);
184 fprintf(
185 stderr,
186 "Input files must be y4m or yuv.\n"
187 "If multiple input files are specified, they correspond to spatial "
188 "layers, and there should be as many as there are spatial layers.\n"
189 "All input files must have the same width, height, frame rate and number "
190 "of frames.\n"
191 "If only one file is specified, it is used for all spatial layers.\n");
192 exit(EXIT_FAILURE);
193}
194
195static int file_is_y4m(const char detect[4]) {
196 return memcmp(detect, "YUV4", 4) == 0;
197}
198
199static int fourcc_is_ivf(const char detect[4]) {
200 if (memcmp(detect, "DKIF", 4) == 0) {
201 return 1;
202 }
203 return 0;
204}
205
206static const int option_max_values[ALL_OPTION_TYPES] = { 63, INT_MAX, INT_MAX,
207 1 };
208
209static const int option_min_values[ALL_OPTION_TYPES] = { 0, 0, 1, 0 };
210
211static void open_input_file(struct AvxInputContext *input,
213
214 input->file = strcmp(input->filename, "-") ? fopen(input->filename, "rb")
215 : set_binary_mode(stdin);
216
217 if (!input->file) fatal("Failed to open input file");
218
219 if (!fseeko(input->file, 0, SEEK_END)) {
220
221
222
223 input->length = ftello(input->file);
224 rewind(input->file);
225 }
226
227
228 input->pixel_aspect_ratio.numerator = 1;
229 input->pixel_aspect_ratio.denominator = 1;
230
231
232
233
234 input->detect.buf_read = fread(input->detect.buf, 1, 4, input->file);
235 input->detect.position = 0;
236
237 if (input->detect.buf_read == 4 && file_is_y4m(input->detect.buf)) {
238 if (y4m_input_open(&input->y4m, input->file, input->detect.buf, 4, csp,
239 input->only_i420) >= 0) {
240 input->file_type = FILE_TYPE_Y4M;
241 input->width = input->y4m.pic_w;
242 input->height = input->y4m.pic_h;
243 input->pixel_aspect_ratio.numerator = input->y4m.par_n;
244 input->pixel_aspect_ratio.denominator = input->y4m.par_d;
245 input->framerate.numerator = input->y4m.fps_n;
246 input->framerate.denominator = input->y4m.fps_d;
247 input->fmt = input->y4m.aom_fmt;
248 input->bit_depth = static_cast<aom_bit_depth_t>(input->y4m.bit_depth);
249 } else {
250 fatal("Unsupported Y4M stream.");
251 }
252 } else if (input->detect.buf_read == 4 && fourcc_is_ivf(input->detect.buf)) {
253 fatal("IVF is not supported as input.");
254 } else {
255 input->file_type = FILE_TYPE_RAW;
256 }
257}
258
259static aom_codec_err_t extract_option(LAYER_OPTION_TYPE type,
char *input,
260 int *value0, int *value1) {
261 if (type == SCALE_FACTOR) {
262 *value0 = (int)strtol(input, &input, 10);
264 *value1 = (int)strtol(input, &input, 10);
265
266 if (*value0 < option_min_values[SCALE_FACTOR] ||
267 *value1 < option_min_values[SCALE_FACTOR] ||
268 *value0 > option_max_values[SCALE_FACTOR] ||
269 *value1 > option_max_values[SCALE_FACTOR] ||
270 *value0 > *value1)
272 } else {
273 *value0 = atoi(input);
274 if (*value0 < option_min_values[type] || *value0 > option_max_values[type])
276 }
278}
279
282 int *option0, int *option1) {
284 char *input_string;
285 char *token;
286 const char *delim = ",";
288 int i = 0;
289
290 if (type == BITRATE)
291 num_layers =
293
294 if (input == NULL || option0 == NULL ||
295 (option1 == NULL && type == SCALE_FACTOR))
297
298 const size_t input_length = strlen(input);
299 input_string = reinterpret_cast<char *>(malloc(input_length + 1));
301 memcpy(input_string, input, input_length + 1);
302 token = strtok(input_string, delim);
303 for (i = 0; i < num_layers; ++i) {
304 if (token != NULL) {
305 res = extract_option(type, token, option0 + i, option1 + i);
307 token = strtok(NULL, delim);
308 } else {
310 break;
311 }
312 }
313 free(input_string);
314 return res;
315}
316
317static void parse_command_line(int argc, const char **argv_,
318 AppInput *app_input,
321 struct arg arg;
322 char **argv = NULL;
323 char **argi = NULL;
324 char **argj = NULL;
325 char string_options[1024] = { 0 };
326
327
330 app_input->layering_mode = 0;
331 app_input->output_obu = 0;
332 app_input->decode = 1;
335
336
337 argv = argv_dup(argc - 1, argv_ + 1);
338 if (!argv) {
339 fprintf(stderr, "Error allocating argument list\n");
340 exit(EXIT_FAILURE);
341 }
342 for (argi = argj = argv; (*argj = *argi); argi += arg.argv_step) {
343 arg.argv_step = 1;
344
345 if (arg_match(&arg, &outputfile, argi)) {
346 app_input->output_filename = arg.val;
347 } else if (arg_match(&arg, &width_arg, argi)) {
348 enc_cfg->
g_w = arg_parse_uint(&arg);
349 } else if (arg_match(&arg, &height_arg, argi)) {
350 enc_cfg->
g_h = arg_parse_uint(&arg);
351 } else if (arg_match(&arg, &timebase_arg, argi)) {
352 enc_cfg->
g_timebase = arg_parse_rational(&arg);
353 } else if (arg_match(&arg, &bitrate_arg, argi)) {
355 } else if (arg_match(&arg, &spatial_layers_arg, argi)) {
357 } else if (arg_match(&arg, &temporal_layers_arg, argi)) {
359 } else if (arg_match(&arg, &speed_arg, argi)) {
360 app_input->speed = arg_parse_uint(&arg);
361 if (app_input->speed > 11) {
362 aom_tools_warn("Mapping speed %d to speed 11.\n", app_input->speed);
363 }
364 } else if (arg_match(&arg, &aqmode_arg, argi)) {
365 app_input->aq_mode = arg_parse_uint(&arg);
366 } else if (arg_match(&arg, &threads_arg, argi)) {
367 enc_cfg->
g_threads = arg_parse_uint(&arg);
368 } else if (arg_match(&arg, &layering_mode_arg, argi)) {
369 app_input->layering_mode = arg_parse_int(&arg);
370 } else if (arg_match(&arg, &kf_dist_arg, argi)) {
373 } else if (arg_match(&arg, &scale_factors_arg, argi)) {
377 app_input->scale_factors_explicitly_set = true;
379 die("Failed to parse scale factors: %s\n",
381 }
382 } else if (arg_match(&arg, &min_q_arg, argi)) {
384 } else if (arg_match(&arg, &max_q_arg, argi)) {
386#if CONFIG_AV1_HIGHBITDEPTH
387 } else if (arg_match(&arg, &bitdepth_arg, argi)) {
394 break;
398 break;
399 default:
400 die(
"Error: Invalid bit depth selected (%d)\n", enc_cfg->
g_bit_depth);
401 }
402#endif
403 } else if (arg_match(&arg, &dropframe_thresh_arg, argi)) {
405 } else if (arg_match(&arg, &error_resilient_arg, argi)) {
408 die("Invalid value for error resilient (0, 1): %d.",
410 } else if (arg_match(&arg, &output_obu_arg, argi)) {
411 app_input->output_obu = arg_parse_uint(&arg);
412 if (app_input->output_obu != 0 && app_input->output_obu != 1)
413 die("Invalid value for obu output flag (0, 1): %d.",
414 app_input->output_obu);
415 } else if (arg_match(&arg, &test_decode_arg, argi)) {
416 app_input->decode = arg_parse_uint(&arg);
417 if (app_input->decode != 0 && app_input->decode != 1)
418 die("Invalid value for test decode flag (0, 1): %d.",
419 app_input->decode);
420 } else if (arg_match(&arg, &tune_content_arg, argi)) {
421 app_input->tune_content = arg_parse_enum_or_int(&arg);
422 printf("tune content %d\n", app_input->tune_content);
423 } else if (arg_match(&arg, &psnr_arg, argi)) {
424 app_input->show_psnr = 1;
425 } else if (arg_match(&arg, &ext_rc_arg, argi)) {
426 app_input->use_external_rc = true;
427#if CONFIG_CWG_E050
428 } else if (arg_match(&arg, &multilayer_metadata_file_arg, argi)) {
429 app_input->multilayer_metadata_file = arg.val;
430#endif
431 } else {
432 ++argj;
433 }
434 }
435
436
437 for (argi = argj = argv; (*argj = *argi); argi += arg.argv_step) {
438 arg.argv_step = 1;
439 if (arg_match(&arg, &bitrates_arg, argi)) {
444 }
445 } else {
446 ++argj;
447 }
448 }
449
450
451 if (strlen(string_options) > 0)
452 strncpy(app_input->options, string_options, OPTION_BUFFER_SIZE);
453
454
455 for (argi = argv; *argi; ++argi)
456 if (argi[0][0] == '-' && strlen(argi[0]) > 1)
457 die("Error: Unrecognized option %s\n", *argi);
458
459 if (argv[0] == NULL) {
460 usage_exit();
461 }
462
463 int input_count = 0;
464 while (argv[input_count] != NULL && input_count < MAX_NUM_SPATIAL_LAYERS) {
465 app_input->input_ctx[input_count].filename = argv[input_count];
466 ++input_count;
467 }
469 die("Error: Number of input files does not match number of spatial layers");
470 }
471 if (argv[input_count] != NULL) {
472 die("Error: Too many input files specified, there should be at most %d",
473 MAX_NUM_SPATIAL_LAYERS);
474 }
475
476 free(argv);
477
478 for (int i = 0; i < input_count; ++i) {
480 if (app_input->input_ctx[i].file_type == FILE_TYPE_Y4M) {
481 if (enc_cfg->
g_w == 0 || enc_cfg->
g_h == 0) {
482
483 enc_cfg->
g_w = app_input->input_ctx[i].width;
484 enc_cfg->
g_h = app_input->input_ctx[i].height;
485
486 enc_cfg->
g_timebase.
num = app_input->input_ctx[i].framerate.denominator;
487 enc_cfg->
g_timebase.
den = app_input->input_ctx[i].framerate.numerator;
488 }
else if (enc_cfg->
g_w != app_input->input_ctx[i].width ||
489 enc_cfg->
g_h != app_input->input_ctx[i].height ||
491 app_input->input_ctx[i].framerate.denominator ||
493 app_input->input_ctx[i].framerate.numerator) {
494 die("Error: Input file dimensions and/or frame rate mismatch");
495 }
496 }
497 }
498 if (enc_cfg->
g_w == 0 || enc_cfg->
g_h == 0) {
499 die("Error: Input file dimensions not set, use -w and -h");
500 }
501
502 if (enc_cfg->
g_w < 16 || enc_cfg->
g_w % 2 || enc_cfg->
g_h < 16 ||
504 die(
"Invalid resolution: %d x %d\n", enc_cfg->
g_w, enc_cfg->
g_h);
505
506 printf(
507 "Codec %s\n"
508 "layers: %d\n"
509 "width %u, height: %u\n"
510 "num: %d, den: %d, bitrate: %u\n"
511 "gop size: %u\n",
516}
517
518static const int mode_to_num_temporal_layers[12] = {
519 1, 2, 3, 3, 2, 1, 1, 3, 3, 3, 3, 3,
520};
521static const int mode_to_num_spatial_layers[12] = {
522 1, 1, 1, 1, 1, 2, 3, 2, 3, 3, 3, 3,
523};
524
525
526struct RateControlMetrics {
527
529
531
533
535
537
539
541
542
543 double avg_st_encoding_bitrate;
544
545 double variance_st_encoding_bitrate;
546
547 int window_size;
548
549 int window_count;
551};
552
553static const int REF_FRAMES = 8;
554
555static const int INTER_REFS_PER_FRAME = 7;
556
557
558enum {
559 SVC_LAST_FRAME = 0,
560 SVC_LAST2_FRAME,
561 SVC_LAST3_FRAME,
562 SVC_GOLDEN_FRAME,
563 SVC_BWDREF_FRAME,
564 SVC_ALTREF2_FRAME,
565 SVC_ALTREF_FRAME
566};
567
568static int read_frame(
struct AvxInputContext *input_ctx,
aom_image_t *img) {
569 FILE *f = input_ctx->file;
570 y4m_input *y4m = &input_ctx->y4m;
571 int shortread = 0;
572
573 if (input_ctx->file_type == FILE_TYPE_Y4M) {
574 if (y4m_input_fetch_frame(y4m, f, img) < 1) return 0;
575 } else {
576 shortread = read_yuv_frame(input_ctx, img);
577 }
578
579 return !shortread;
580}
581
582static void close_input_file(struct AvxInputContext *input) {
583 fclose(input->file);
584 if (input->file_type == FILE_TYPE_Y4M) y4m_input_close(&input->y4m);
585}
586
587
588
589
590
591
592
593static void set_rate_control_metrics(struct RateControlMetrics *rc,
594 double framerate, int ss_number_layers,
595 int ts_number_layers) {
597 ts_rate_decimator[0] = 1;
598 if (ts_number_layers == 2) {
599 ts_rate_decimator[0] = 2;
600 ts_rate_decimator[1] = 1;
601 }
602 if (ts_number_layers == 3) {
603 ts_rate_decimator[0] = 4;
604 ts_rate_decimator[1] = 2;
605 ts_rate_decimator[2] = 1;
606 }
607
608
609 for (int sl = 0; sl < ss_number_layers; ++sl) {
610 int i = sl * ts_number_layers;
611 rc->layer_framerate[0] = framerate / ts_rate_decimator[0];
612 rc->layer_pfb[i] =
613 1000.0 * rc->layer_target_bitrate[i] / rc->layer_framerate[0];
614 for (int tl = 0; tl < ts_number_layers; ++tl) {
615 i = sl * ts_number_layers + tl;
616 if (tl > 0) {
617 rc->layer_framerate[tl] = framerate / ts_rate_decimator[tl];
618 rc->layer_pfb[i] =
619 1000.0 *
620 (rc->layer_target_bitrate[i] - rc->layer_target_bitrate[i - 1]) /
621 (rc->layer_framerate[tl] - rc->layer_framerate[tl - 1]);
622 }
623 rc->layer_input_frames[tl] = 0;
624 rc->layer_enc_frames[tl] = 0;
625 rc->layer_encoding_bitrate[i] = 0.0;
626 rc->layer_avg_frame_size[i] = 0.0;
627 rc->layer_avg_rate_mismatch[i] = 0.0;
628 }
629 }
630 rc->window_count = 0;
631 rc->window_size = 15;
632 rc->avg_st_encoding_bitrate = 0.0;
633 rc->variance_st_encoding_bitrate = 0.0;
634}
635
636static void printout_rate_control_summary(struct RateControlMetrics *rc,
637 int frame_cnt, int ss_number_layers,
638 int ts_number_layers) {
639 int tot_num_frames = 0;
640 double perc_fluctuation = 0.0;
641 printf("Total number of processed frames: %d\n\n", frame_cnt - 1);
642 printf("Rate control layer stats for %d layer(s):\n\n", ts_number_layers);
643 for (int sl = 0; sl < ss_number_layers; ++sl) {
644 tot_num_frames = 0;
645 for (int tl = 0; tl < ts_number_layers; ++tl) {
646 int i = sl * ts_number_layers + tl;
647 const int num_dropped =
648 tl > 0 ? rc->layer_input_frames[tl] - rc->layer_enc_frames[tl]
649 : rc->layer_input_frames[tl] - rc->layer_enc_frames[tl] - 1;
650 tot_num_frames += rc->layer_input_frames[tl];
651 rc->layer_encoding_bitrate[i] = 0.001 * rc->layer_framerate[tl] *
652 rc->layer_encoding_bitrate[i] /
653 tot_num_frames;
654 rc->layer_avg_frame_size[i] =
655 rc->layer_avg_frame_size[i] / rc->layer_enc_frames[tl];
656 rc->layer_avg_rate_mismatch[i] =
657 100.0 * rc->layer_avg_rate_mismatch[i] / rc->layer_enc_frames[tl];
658 printf("For layer#: %d %d \n", sl, tl);
659 printf("Bitrate (target vs actual): %d %f\n", rc->layer_target_bitrate[i],
660 rc->layer_encoding_bitrate[i]);
661 printf("Average frame size (target vs actual): %f %f\n", rc->layer_pfb[i],
662 rc->layer_avg_frame_size[i]);
663 printf("Average rate_mismatch: %f\n", rc->layer_avg_rate_mismatch[i]);
664 printf(
665 "Number of input frames, encoded (non-key) frames, "
666 "and perc dropped frames: %d %d %f\n",
667 rc->layer_input_frames[tl], rc->layer_enc_frames[tl],
668 100.0 * num_dropped / rc->layer_input_frames[tl]);
669 printf("\n");
670 }
671 }
672 rc->avg_st_encoding_bitrate = rc->avg_st_encoding_bitrate / rc->window_count;
673 rc->variance_st_encoding_bitrate =
674 rc->variance_st_encoding_bitrate / rc->window_count -
675 (rc->avg_st_encoding_bitrate * rc->avg_st_encoding_bitrate);
676 perc_fluctuation = 100.0 * sqrt(rc->variance_st_encoding_bitrate) /
677 rc->avg_st_encoding_bitrate;
678 printf("Short-time stats, for window of %d frames:\n", rc->window_size);
679 printf("Average, rms-variance, and percent-fluct: %f %f %f\n",
680 rc->avg_st_encoding_bitrate, sqrt(rc->variance_st_encoding_bitrate),
681 perc_fluctuation);
682 if (frame_cnt - 1 != tot_num_frames)
683 die("Error: Number of input frames not equal to output!\n");
684}
685
686
687static void set_layer_pattern(
691 int spatial_layer_id, int is_key_frame, int ksvc_mode, int speed,
692 int *reference_updated) {
693
694
695 int use_rps_example = 0;
696 int i;
697 int enable_longterm_temporal_ref = 1;
698 int shift = (layering_mode == 8) ? 2 : 0;
699 int simulcast_mode = (layering_mode == 11);
700 *use_svc_control = 1;
702 int lag_index = 0;
703 int base_count = superframe_cnt >> 2;
707
708
709
710 for (i = 0; i < INTER_REFS_PER_FRAME; i++) ref_frame_config->
ref_idx[i] = i;
711 for (i = 0; i < INTER_REFS_PER_FRAME; i++) ref_frame_config->
reference[i] = 0;
712 for (i = 0; i < REF_FRAMES; i++) ref_frame_config->
refresh[i] = 0;
713
714 if (ksvc_mode) {
715
716
717 layering_mode = 9;
718 }
719 switch (layering_mode) {
720 case 0:
721 if (use_rps_example == 0) {
722
725 ref_frame_config->
refresh[0] = 1;
726 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
727 } else {
728
729
730
731
732
733 int last_idx = 0;
734 int last_idx_refresh = 0;
735 int gld_idx = 0;
736 int alt_ref_idx = 0;
737 int lag_alt = 4;
738 int lag_gld = 8;
741 int sh = 8;
742
743 if (superframe_cnt > 1) last_idx = (superframe_cnt - 1) % sh;
744
745 last_idx_refresh = superframe_cnt % sh;
746
747 if (superframe_cnt > lag_gld) gld_idx = (superframe_cnt - lag_gld) % sh;
748
749 if (superframe_cnt > lag_alt)
750 alt_ref_idx = (superframe_cnt - lag_alt) % sh;
751
752
753 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
754 ref_frame_config->
ref_idx[i] = last_idx;
755
756 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = last_idx;
757 ref_frame_config->
ref_idx[SVC_LAST2_FRAME] = last_idx_refresh;
758 ref_frame_config->
ref_idx[SVC_GOLDEN_FRAME] = gld_idx;
759 ref_frame_config->
ref_idx[SVC_ALTREF_FRAME] = alt_ref_idx;
760
761 ref_frame_config->
refresh[last_idx_refresh] = 1;
762
763 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
764 ref_frame_config->
reference[SVC_ALTREF_FRAME] = 1;
765 ref_frame_config->
reference[SVC_GOLDEN_FRAME] = 1;
766
767 if (superframe_cnt % 200 == 0 && superframe_cnt > 0) {
768 ref_frame_config->
reference[SVC_LAST_FRAME] = 0;
769 ref_frame_config->
reference[SVC_ALTREF_FRAME] = 0;
770 ref_frame_config->
reference[SVC_GOLDEN_FRAME] = 1;
771
772
773
774 if (superframe_cnt % 400 == 0 && superframe_cnt > 0) {
775 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = gld_idx;
776 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
777 ref_frame_config->
reference[SVC_ALTREF_FRAME] = 0;
778 ref_frame_config->
reference[SVC_GOLDEN_FRAME] = 0;
779 }
780 }
781 }
782 break;
783 case 1:
784
785
786
787
788 base_count = superframe_cnt >> 1;
789 ref_frame_config->
ref_idx[SVC_GOLDEN_FRAME] = 3;
790
791 lag_index = 5;
792 if (base_count > 0) {
793 lag_index = 5 + (base_count % 3);
794 if (superframe_cnt % 2 != 0) lag_index = 5 + ((base_count + 1) % 3);
795 }
796
797 ref_frame_config->
ref_idx[SVC_ALTREF_FRAME] = lag_index;
798 if (superframe_cnt % 2 == 0) {
800
801 ref_frame_config->
refresh[0] = 1;
802 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
803
804 ref_frame_config->
refresh[lag_index] = 1;
805
806 if (base_count % 32 == 0) ref_frame_config->
refresh[3] = 1;
807 } else {
809
810 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
811 }
812
814 ref_frame_config->
reference[SVC_GOLDEN_FRAME] = 1;
815 ref_frame_config->
reference[SVC_ALTREF_FRAME] = 1;
816 }
817 break;
818 case 2:
819
820
821
822
823 if (superframe_cnt % 4 == 0) {
824
826
827 ref_frame_config->
refresh[0] = 1;
828 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
829 } else if ((superframe_cnt - 1) % 4 == 0) {
831
832 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
833 } else if ((superframe_cnt - 2) % 4 == 0) {
835
836 ref_frame_config->
refresh[1] = 1;
837 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
838 } else if ((superframe_cnt - 3) % 4 == 0) {
840
841
842
843 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 1;
844 ref_frame_config->
ref_idx[SVC_LAST2_FRAME] = 0;
845 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
846 }
847 break;
848 case 3:
849
850
851
852
853
854
855
856 ref_frame_config->
ref_idx[SVC_GOLDEN_FRAME] = 3;
857
858 lag_index = 5;
859 if (base_count > 0) {
860 lag_index = 5 + (base_count % 3);
861 if (superframe_cnt % 4 != 0) lag_index = 5 + ((base_count + 1) % 3);
862 }
863
864 ref_frame_config->
ref_idx[SVC_ALTREF_FRAME] = lag_index;
865 if (superframe_cnt % 4 == 0) {
866
868
869 ref_frame_config->
refresh[0] = 1;
870 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
871
872 if (base_count % 10 == 0) ref_frame_config->
refresh[3] = 1;
873
874 ref_frame_config->
refresh[lag_index] = 1;
875 } else if ((superframe_cnt - 1) % 4 == 0) {
877
878 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
879 } else if ((superframe_cnt - 2) % 4 == 0) {
881
882 ref_frame_config->
refresh[1] = 1;
883 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
884 } else if ((superframe_cnt - 3) % 4 == 0) {
886
887
888
889 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 1;
890 ref_frame_config->
ref_idx[SVC_LAST2_FRAME] = 0;
891 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
892 }
893
894 ref_frame_config->
reference[SVC_GOLDEN_FRAME] = 1;
895 ref_frame_config->
reference[SVC_ALTREF_FRAME] = 1;
896
897 if (speed >= 7) {
900 }
901 break;
902 case 4:
903
904
905
906
907
908 if (superframe_cnt % 4 == 0) {
909
911
912 ref_frame_config->
refresh[0] = 1;
913 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
914 } else if ((superframe_cnt - 1) % 4 == 0) {
916
917 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
918 } else if ((superframe_cnt - 2) % 4 == 0) {
920
921 ref_frame_config->
refresh[3] = 1;
922 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
923 } else if ((superframe_cnt - 3) % 4 == 0) {
925
926 ref_frame_config->
reference[SVC_GOLDEN_FRAME] = 1;
927 }
928 break;
929
930 case 5:
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
948
949 ref_frame_config->
refresh[0] = 1;
950 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 0;
951 ref_frame_config->
ref_idx[SVC_LAST2_FRAME] = 2;
952 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
954
955
956 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 1;
957 ref_frame_config->
ref_idx[SVC_GOLDEN_FRAME] = 0;
958 ref_frame_config->
ref_idx[SVC_LAST2_FRAME] = 2;
959 ref_frame_config->
refresh[1] = 1;
960 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
961 ref_frame_config->
reference[SVC_GOLDEN_FRAME] = 1;
962 }
963 break;
964
965 case 6:
966
967
968
969
970
973
974 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
975 ref_frame_config->
ref_idx[i] = 0;
976 ref_frame_config->
refresh[0] = 1;
977 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
979
980
981
982 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
983 ref_frame_config->
ref_idx[i] = 0;
984 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 1;
985 ref_frame_config->
refresh[1] = 1;
986 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
987 ref_frame_config->
reference[SVC_GOLDEN_FRAME] = 1;
989
990
991
992 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
993 ref_frame_config->
ref_idx[i] = 1;
994 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 2;
995 ref_frame_config->
refresh[2] = 1;
996 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
997 ref_frame_config->
reference[SVC_GOLDEN_FRAME] = 1;
998
999
1000 if (enable_longterm_temporal_ref) {
1001 ref_frame_config->
ref_idx[SVC_ALTREF_FRAME] = REF_FRAMES - 1;
1002 ref_frame_config->
reference[SVC_ALTREF_FRAME] = 1;
1003 if (base_count % 10 == 0)
1004 ref_frame_config->
refresh[REF_FRAMES - 1] = 1;
1005 }
1006 }
1007 break;
1008 case 7:
1009
1010 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
1011 if (superframe_cnt % 4 == 0) {
1012
1015
1016
1017 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1018 ref_frame_config->
ref_idx[i] = 0;
1019 ref_frame_config->
refresh[0] = 1;
1021
1022 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1023 ref_frame_config->
ref_idx[i] = 0;
1024 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 1;
1025 ref_frame_config->
refresh[1] = 1;
1026 }
1027 } else if ((superframe_cnt - 1) % 4 == 0) {
1028
1031 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1032 ref_frame_config->
ref_idx[i] = 0;
1033 ref_frame_config->
ref_idx[SVC_GOLDEN_FRAME] = 3;
1034 ref_frame_config->
refresh[3] = 1;
1036
1037
1038
1039 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1040 ref_frame_config->
ref_idx[i] = 3;
1041 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 1;
1042 }
1043 } else if ((superframe_cnt - 2) % 4 == 0) {
1044
1047
1048
1049
1050 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1051 ref_frame_config->
ref_idx[i] = 0;
1052 ref_frame_config->
ref_idx[SVC_GOLDEN_FRAME] = 5 - shift;
1053 ref_frame_config->
refresh[5 - shift] = 1;
1055
1056
1057
1058 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1059 ref_frame_config->
ref_idx[i] = 5 - shift;
1060 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 1;
1061 ref_frame_config->
ref_idx[SVC_LAST3_FRAME] = 6 - shift;
1062 ref_frame_config->
refresh[6 - shift] = 1;
1063 }
1064 } else if ((superframe_cnt - 3) % 4 == 0) {
1065
1068
1069
1070
1071 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1072 ref_frame_config->
ref_idx[i] = 0;
1073 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 5 - shift;
1074 ref_frame_config->
ref_idx[SVC_GOLDEN_FRAME] = 3;
1075 ref_frame_config->
refresh[3] = 1;
1077
1078
1079 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1080 ref_frame_config->
ref_idx[i] = 0;
1081 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 6 - shift;
1082 ref_frame_config->
ref_idx[SVC_GOLDEN_FRAME] = 3;
1083 }
1084 }
1085 break;
1086 case 8:
1087
1088
1089
1090
1091
1092
1093 case 9:
1094
1095
1096
1097
1098
1099 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
1100 if (superframe_cnt % 4 == 0) {
1101
1104
1105
1106 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1107 ref_frame_config->
ref_idx[i] = 0;
1108 ref_frame_config->
refresh[0] = 1;
1110
1111
1112
1113 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1114 ref_frame_config->
ref_idx[i] = 0;
1115 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 1;
1116 ref_frame_config->
refresh[1] = 1;
1118
1119
1120
1121 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1122 ref_frame_config->
ref_idx[i] = 1;
1123 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 2;
1124 ref_frame_config->
refresh[2] = 1;
1125 }
1126 } else if ((superframe_cnt - 1) % 4 == 0) {
1127
1130
1131
1132
1133 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1134 ref_frame_config->
ref_idx[i] = 0;
1135 ref_frame_config->
ref_idx[SVC_GOLDEN_FRAME] = 3;
1136 ref_frame_config->
refresh[3] = 1;
1138
1139
1140
1141 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1142 ref_frame_config->
ref_idx[i] = 3;
1143 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 1;
1144 ref_frame_config->
ref_idx[SVC_LAST2_FRAME] = 4;
1145 ref_frame_config->
refresh[4] = 1;
1147
1148
1149
1150 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1151 ref_frame_config->
ref_idx[i] = 4;
1152 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 2;
1153 }
1154 } else if ((superframe_cnt - 2) % 4 == 0) {
1155
1158
1159
1160
1161 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1162 ref_frame_config->
ref_idx[i] = 0;
1163 ref_frame_config->
ref_idx[SVC_GOLDEN_FRAME] = 5 - shift;
1164 ref_frame_config->
refresh[5 - shift] = 1;
1166
1167
1168
1169 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1170 ref_frame_config->
ref_idx[i] = 5 - shift;
1171 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 1;
1172 ref_frame_config->
ref_idx[SVC_LAST3_FRAME] = 6 - shift;
1173 ref_frame_config->
refresh[6 - shift] = 1;
1175
1176
1177
1178 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1179 ref_frame_config->
ref_idx[i] = 6 - shift;
1180 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 2;
1181 ref_frame_config->
ref_idx[SVC_LAST3_FRAME] = 7 - shift;
1182 ref_frame_config->
refresh[7 - shift] = 1;
1183 }
1184 } else if ((superframe_cnt - 3) % 4 == 0) {
1185
1188
1189
1190
1191 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1192 ref_frame_config->
ref_idx[i] = 0;
1193 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 5 - shift;
1194 ref_frame_config->
ref_idx[SVC_GOLDEN_FRAME] = 3;
1195 ref_frame_config->
refresh[3] = 1;
1197
1198
1199 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1200 ref_frame_config->
ref_idx[i] = 0;
1201 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 6 - shift;
1202 ref_frame_config->
ref_idx[SVC_GOLDEN_FRAME] = 3;
1203 ref_frame_config->
ref_idx[SVC_LAST2_FRAME] = 4;
1204 ref_frame_config->
refresh[4] = 1;
1206
1207
1208 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1209 ref_frame_config->
ref_idx[i] = 0;
1210 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 7 - shift;
1211 ref_frame_config->
ref_idx[SVC_GOLDEN_FRAME] = 4;
1212 }
1213 }
1214 break;
1215 case 11:
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1236
1237 for (i = 0; i < REF_FRAMES; i++) ref_frame_config->
refresh[i] = 0;
1238 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1239 ref_frame_config->
ref_idx[i] = 0;
1240
1241 if (is_key_frame) {
1243
1244
1245
1246 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 0;
1247 ref_frame_config->
ref_idx[SVC_GOLDEN_FRAME] = 1;
1248 ref_frame_config->
refresh[0] = 1;
1249 ref_frame_config->
refresh[1] = 1;
1251
1252
1253
1254 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 2;
1255 ref_frame_config->
ref_idx[SVC_GOLDEN_FRAME] = 3;
1256 ref_frame_config->
refresh[2] = 1;
1257 ref_frame_config->
refresh[3] = 1;
1259
1260
1261
1262 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 4;
1263 ref_frame_config->
ref_idx[SVC_GOLDEN_FRAME] = 5;
1264 ref_frame_config->
refresh[4] = 1;
1265 ref_frame_config->
refresh[5] = 1;
1266 }
1267 } else if (superframe_cnt % 4 == 0) {
1268
1271
1272
1273
1274 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
1275 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1276 ref_frame_config->
ref_idx[i] = 1;
1277 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 0;
1278 ref_frame_config->
refresh[0] = 1;
1280
1281
1282
1283 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
1284 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1285 ref_frame_config->
ref_idx[i] = 3;
1286 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 2;
1287 ref_frame_config->
refresh[2] = 1;
1289
1290
1291
1292 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
1293 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1294 ref_frame_config->
ref_idx[i] = 5;
1295 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 4;
1296 ref_frame_config->
refresh[4] = 1;
1297 }
1298 } else if ((superframe_cnt - 1) % 4 == 0) {
1299
1302
1303
1304 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
1305 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1306 ref_frame_config->
ref_idx[i] = 1;
1307 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 0;
1309
1310
1311 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
1312 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1313 ref_frame_config->
ref_idx[i] = 3;
1314 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 2;
1316
1317
1318 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
1319 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1320 ref_frame_config->
ref_idx[i] = 5;
1321 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 4;
1322 }
1323 } else if ((superframe_cnt - 2) % 4 == 0) {
1324
1327
1328
1329
1330 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
1331 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1332 ref_frame_config->
ref_idx[i] = 1;
1333 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 0;
1334 ref_frame_config->
refresh[1] = 1;
1336
1337
1338
1339 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
1340 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1341 ref_frame_config->
ref_idx[i] = 3;
1342 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 2;
1343 ref_frame_config->
refresh[3] = 1;
1345
1346
1347
1348 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
1349 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1350 ref_frame_config->
ref_idx[i] = 5;
1351 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 4;
1352 ref_frame_config->
refresh[5] = 1;
1353 }
1354 } else if ((superframe_cnt - 3) % 4 == 0) {
1355
1358
1359
1360 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
1361 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1362 ref_frame_config->
ref_idx[i] = 0;
1363 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 1;
1365
1366
1367 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
1368 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1369 ref_frame_config->
ref_idx[i] = 2;
1370 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 3;
1372
1373
1374 ref_frame_config->
reference[SVC_LAST_FRAME] = 1;
1375 for (i = 0; i < INTER_REFS_PER_FRAME; i++)
1376 ref_frame_config->
ref_idx[i] = 4;
1377 ref_frame_config->
ref_idx[SVC_LAST_FRAME] = 5;
1378 }
1379 }
1381
1382 ref_frame_config->
reference[SVC_GOLDEN_FRAME] = 1;
1383 if (ksvc_mode) {
1384
1385
1386 if (!is_key_frame) ref_frame_config->
reference[SVC_GOLDEN_FRAME] = 0;
1387 }
1389
1390
1391 ref_frame_config->
reference[SVC_LAST_FRAME] = 0;
1392 }
1393 }
1394
1395
1396
1397
1398 if (!simulcast_mode && enable_longterm_temporal_ref &&
1400 ref_frame_config->
ref_idx[SVC_ALTREF_FRAME] = REF_FRAMES - 1;
1401 if (!is_key_frame) ref_frame_config->
reference[SVC_ALTREF_FRAME] = 1;
1403 ref_frame_config->
refresh[REF_FRAMES - 1] = 1;
1404 }
1405 break;
1406 default: assert(0); die("Error: Unsupported temporal layering mode!\n");
1407 }
1408 for (i = 0; i < REF_FRAMES; i++) {
1409 if (ref_frame_config->
refresh[i] == 1) {
1410 *reference_updated = 1;
1411 break;
1412 }
1413 }
1414}
1415
1416static void write_literal(struct aom_write_bit_buffer *wb, uint32_t data,
1417 uint8_t bits, uint32_t offset = 0) {
1418 if (bits > 32) {
1419 die("Invalid bits value %d > 32\n", bits);
1420 }
1421 const uint32_t max = static_cast<uint32_t>(((uint64_t)1 << bits) - 1);
1422 if (data < offset || (data - offset) > max) {
1423 die("Invalid data, value %u out of range [%u, %" PRIu64 "]\n", data, offset,
1424 (uint64_t)max + offset);
1425 }
1426 aom_wb_write_unsigned_literal(wb, data - offset, bits);
1427}
1428
1429static void write_depth_representation_element(
1430 struct aom_write_bit_buffer *buffer,
1431 const std::pair<libaom_examples::DepthRepresentationElement, bool>
1432 &element) {
1433 if (!element.second) {
1434 return;
1435 }
1436 write_literal(buffer, element.first.sign_flag, 1);
1437 write_literal(buffer, element.first.exponent, 7);
1438 if (element.first.mantissa_len == 0 || element.first.mantissa_len > 32) {
1439 die("Invalid mantissan_len %d\n", element.first.mantissa_len);
1440 }
1441 write_literal(buffer, element.first.mantissa_len - 1, 5);
1442 write_literal(buffer, element.first.mantissa, element.first.mantissa_len);
1443}
1444
1445static void write_color_properties(
1446 struct aom_write_bit_buffer *buffer,
1447 const std::pair<libaom_examples::ColorProperties, bool> &color_properties) {
1448 write_literal(buffer, color_properties.second, 1);
1449 if (color_properties.second) {
1450 write_literal(buffer, color_properties.first.color_range, 1);
1451 write_literal(buffer, color_properties.first.color_primaries, 8);
1452 write_literal(buffer, color_properties.first.transfer_characteristics, 8);
1453 write_literal(buffer, color_properties.first.matrix_coefficients, 8);
1454 } else {
1455 write_literal(buffer, 0, 1);
1456 }
1457}
1458
1459static void write_alpha_information(
1460 struct aom_write_bit_buffer *buffer,
1461 const libaom_examples::AlphaInformation &alpha_info) {
1462 write_literal(buffer, alpha_info.alpha_use_idc, 2);
1463 write_literal(buffer, alpha_info.alpha_simple_flag, 1);
1464 if (!alpha_info.alpha_simple_flag) {
1465 write_literal(buffer, alpha_info.alpha_bit_depth, 3, 8);
1466 write_literal(buffer, alpha_info.alpha_clip_idc, 2);
1467 write_literal(buffer, alpha_info.alpha_incr_flag, 1);
1468 write_literal(buffer, alpha_info.alpha_transparent_value,
1469 alpha_info.alpha_bit_depth + 1);
1470 write_literal(buffer, alpha_info.alpha_opaque_value,
1471 alpha_info.alpha_bit_depth + 1);
1472 if (buffer->bit_offset % 8 != 0) {
1473
1474 write_literal(buffer, 0, 8 - (buffer->bit_offset % 8));
1475 }
1476 assert(buffer->bit_offset % 8 == 0);
1477
1478 write_literal(buffer, 0, 6);
1479 write_color_properties(buffer, alpha_info.alpha_color_description);
1480 } else {
1481 write_literal(buffer, 0, 5);
1482 }
1483}
1484
1485static void write_depth_information(
1486 struct aom_write_bit_buffer *buffer,
1487 const libaom_examples::DepthInformation &depth_info) {
1488 write_literal(buffer, depth_info.z_near.second, 1);
1489 write_literal(buffer, depth_info.z_far.second, 1);
1490 write_literal(buffer, depth_info.d_min.second, 1);
1491 write_literal(buffer, depth_info.d_max.second, 1);
1492 write_literal(buffer, depth_info.depth_representation_type, 4);
1493 if (depth_info.d_min.second || depth_info.d_max.second) {
1494 write_literal(buffer, depth_info.disparity_ref_view_id, 2);
1495 }
1496 write_depth_representation_element(buffer, depth_info.z_near);
1497 write_depth_representation_element(buffer, depth_info.z_far);
1498 write_depth_representation_element(buffer, depth_info.d_min);
1499 write_depth_representation_element(buffer, depth_info.d_max);
1500 if (buffer->bit_offset % 8 != 0) {
1501 write_literal(buffer, 0, 8 - (buffer->bit_offset % 8));
1502 }
1503}
1504
1505static void add_multilayer_metadata(
1506 aom_image_t *frame,
const libaom_examples::MultilayerMetadata &multilayer,
1507 int frame_idx, int spatial_id) {
1508
1509
1510
1511 std::vector<uint8_t> data(1024);
1512 struct aom_write_bit_buffer buffer = { data.data(), 0 };
1513
1514 write_literal(&buffer, multilayer.use_case, 6);
1515 if (multilayer.layers.empty()) {
1516 die("Invalid multilayer metadata, no layers found\n");
1517 } else if (multilayer.layers.size() > MAX_NUM_SPATIAL_LAYERS) {
1518 die("Invalid multilayer metadata, too many layers (max is %d)\n",
1519 MAX_NUM_SPATIAL_LAYERS);
1520 }
1521 write_literal(&buffer, (int)multilayer.layers.size() - 1, 2);
1522 assert(buffer.bit_offset % 8 == 0);
1523 for (size_t i = 0; i < multilayer.layers.size(); ++i) {
1524 const libaom_examples::LayerMetadata &layer = multilayer.layers[i];
1525
1526
1527 const int bytes_reserved_for_size = 3;
1528
1529 write_literal(&buffer, 0, bytes_reserved_for_size * 8);
1530 const uint32_t metadata_start = buffer.bit_offset;
1531 write_literal(&buffer, (int)i, 2);
1532 write_literal(&buffer, layer.layer_type, 5);
1533 write_literal(&buffer, layer.luma_plane_only_flag, 1);
1534 write_literal(&buffer, layer.layer_view_type, 3);
1535 write_literal(&buffer, layer.group_id, 2);
1536 write_literal(&buffer, layer.layer_dependency_idc, 3);
1537 write_literal(&buffer, layer.layer_metadata_scope, 2);
1538 write_literal(&buffer, 0, 4);
1539
1540 if (i > 0) {
1541 write_color_properties(&buffer, layer.layer_color_description);
1542 } else {
1543 write_literal(&buffer, 0, 2);
1544 }
1545 assert(buffer.bit_offset % 8 == 0);
1546
1547 if (layer.layer_type == libaom_examples::MULTILAYER_LAYER_TYPE_ALPHA &&
1548 layer.layer_metadata_scope >= libaom_examples::SCOPE_GLOBAL) {
1549 write_alpha_information(&buffer, layer.alpha);
1550 assert(buffer.bit_offset % 8 == 0);
1551 } else if (layer.layer_type ==
1552 libaom_examples::MULTILAYER_LAYER_TYPE_DEPTH &&
1553 layer.layer_metadata_scope >= libaom_examples::SCOPE_GLOBAL) {
1554 write_depth_information(&buffer, layer.depth);
1555 assert(buffer.bit_offset % 8 == 0);
1556 }
1557
1558 assert(buffer.bit_offset % 8 == 0);
1559
1560 const int metadata_size_bytes = (buffer.bit_offset - metadata_start) / 8;
1561 const uint8_t size_pos = metadata_start / 8 - bytes_reserved_for_size;
1562 size_t coded_size;
1563 if (aom_uleb_encode_fixed_size(metadata_size_bytes, bytes_reserved_for_size,
1564 bytes_reserved_for_size,
1565 &buffer.bit_buffer[size_pos], &coded_size)) {
1566
1567 die("Error: Failed to write metadata size\n");
1568 }
1569 }
1570 assert(buffer.bit_offset % 8 == 0);
1572 buffer.bit_buffer, buffer.bit_offset / 8,
1574 die("Error: Failed to add metadata\n");
1575 }
1576
1577 if ((int)multilayer.layers.size() > spatial_id) {
1578 const libaom_examples::LayerMetadata &layer = multilayer.layers[spatial_id];
1579 for (const libaom_examples::FrameLocalMetadata &local_metadata :
1580 layer.local_metadata) {
1581 if (local_metadata.frame_idx == frame_idx) {
1582 if (layer.layer_type == libaom_examples::MULTILAYER_LAYER_TYPE_ALPHA) {
1583 buffer = { data.data(), 0 };
1584 write_alpha_information(&buffer, local_metadata.alpha);
1586 34 ,
1587 buffer.bit_buffer, buffer.bit_offset / 8,
1589 die("Error: Failed to add metadata\n");
1590 }
1591 } else if (layer.layer_type ==
1592 libaom_examples::MULTILAYER_LAYER_TYPE_DEPTH) {
1593 buffer = { data.data(), 0 };
1594 write_depth_information(&buffer, local_metadata.depth);
1596 35 ,
1597 buffer.bit_buffer, buffer.bit_offset / 8,
1599 die("Error: Failed to add metadata\n");
1600 }
1601 }
1602 break;
1603 }
1604 }
1605 }
1606}
1607
1608#if CONFIG_AV1_DECODER
1609
1610
1612 const int frames_out) {
1614 int mismatch = 0;
1615
1616
1619
1620#if CONFIG_AV1_HIGHBITDEPTH
1626 &enc_hbd_img,
1628 enc_img.
d_w, enc_img.
d_h, 16);
1629 aom_img_truncate_16_to_8(&enc_hbd_img, &enc_img);
1630 enc_img = enc_hbd_img;
1631 }
1635 &dec_hbd_img,
1637 dec_img.
d_w, dec_img.
d_h, 16);
1638 aom_img_truncate_16_to_8(&dec_hbd_img, &dec_img);
1639 dec_img = dec_hbd_img;
1640 }
1641 }
1642#endif
1643
1644 if (!aom_compare_img(&enc_img, &dec_img)) {
1645 int y[4], u[4], v[4];
1646#if CONFIG_AV1_HIGHBITDEPTH
1648 aom_find_mismatch_high(&enc_img, &dec_img, y, u, v);
1649 } else {
1650 aom_find_mismatch(&enc_img, &dec_img, y, u, v);
1651 }
1652#else
1653 aom_find_mismatch(&enc_img, &dec_img, y, u, v);
1654#endif
1655 fprintf(stderr,
1656 "Encode/decode mismatch on frame %d at"
1657 " Y[%d, %d] {%d/%d},"
1658 " U[%d, %d] {%d/%d},"
1659 " V[%d, %d] {%d/%d}\n",
1660 frames_out, y[0], y[1], y[2], y[3], u[0], u[1], u[2], u[3], v[0],
1661 v[1], v[2], v[3]);
1662 mismatch = 1;
1663 }
1664
1667 return mismatch;
1668}
1669#endif
1670
1671struct psnr_stats {
1672
1673 uint64_t psnr_sse_total[2];
1674 uint64_t psnr_samples_total[2];
1675 double psnr_totals[2][4];
1676 int psnr_count[2];
1677};
1678
1679static void show_psnr(struct psnr_stats *psnr_stream, double peak) {
1680 double ovpsnr;
1681
1682 if (!psnr_stream->psnr_count[0]) return;
1683
1684 fprintf(stderr, "\nPSNR (Overall/Avg/Y/U/V)");
1685 ovpsnr = sse_to_psnr((double)psnr_stream->psnr_samples_total[0], peak,
1686 (double)psnr_stream->psnr_sse_total[0]);
1687 fprintf(stderr, " %.3f", ovpsnr);
1688
1689 for (int i = 0; i < 4; i++) {
1690 fprintf(stderr, " %.3f",
1691 psnr_stream->psnr_totals[0][i] / psnr_stream->psnr_count[0]);
1692 }
1693 fprintf(stderr, "\n");
1694}
1695
1696static aom::AV1RateControlRtcConfig create_rtc_rc_config(
1698 aom::AV1RateControlRtcConfig rc_cfg;
1699 rc_cfg.width = cfg.
g_w;
1700 rc_cfg.height = cfg.
g_h;
1709
1710 rc_cfg.max_intra_bitrate_pct = 300;
1712
1713 rc_cfg.ss_number_layers = 1;
1714 rc_cfg.ts_number_layers = 1;
1715 rc_cfg.scaling_factor_num[0] = 1;
1716 rc_cfg.scaling_factor_den[0] = 1;
1717 rc_cfg.layer_target_bitrate[0] = static_cast<int>(rc_cfg.target_bandwidth);
1718 rc_cfg.max_quantizers[0] = rc_cfg.max_quantizer;
1719 rc_cfg.min_quantizers[0] = rc_cfg.min_quantizer;
1720 rc_cfg.aq_mode = app_input.aq_mode;
1721
1722 return rc_cfg;
1723}
1724
1725static int qindex_to_quantizer(int qindex) {
1726
1727
1728 static const int quantizer_to_qindex[] = {
1729 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48,
1730 52, 56, 60, 64, 68, 72, 76, 80, 84, 88, 92, 96, 100,
1731 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144, 148, 152,
1732 156, 160, 164, 168, 172, 176, 180, 184, 188, 192, 196, 200, 204,
1733 208, 212, 216, 220, 224, 228, 232, 236, 240, 244, 249, 255,
1734 };
1735 for (int quantizer = 0; quantizer < 64; ++quantizer)
1736 if (quantizer_to_qindex[quantizer] >= qindex) return quantizer;
1737
1738 return 63;
1739}
1740
1744
1745 map.
rows = (cfg->
g_h + 15) / 16;
1746 map.
cols = (cfg->
g_w + 15) / 16;
1747
1749 if (!map.
active_map) die(
"Failed to allocate active map");
1750
1751
1752 for (
unsigned int i = 0; i < map.
rows; ++i) {
1753 for (
unsigned int j = 0; j < map.
cols; ++j) {
1754 int index = map.
cols * i + j;
1756 if (frame_cnt < 300) {
1758 } else if (frame_cnt >= 300) {
1759 if (i < map.rows / 2 && j >= map.
cols / 2) map.
active_map[index] = 0;
1760 }
1761 }
1762 }
1763
1765 die_codec(codec, "Failed to set active map");
1766
1768}
1769
1770int main(int argc, const char **argv) {
1771 AppInput app_input;
1774 AvxVideoWriter *total_layer_file = NULL;
1775 FILE *total_layer_obu_file = NULL;
1777 int frame_cnt = 0;
1779 int frame_avail;
1780 int got_data = 0;
1781 int flags = 0;
1782 int i;
1783 int pts = 0;
1784 int frame_duration = 1;
1789
1790#if CONFIG_INTERNAL_STATS
1791 FILE *stats_file = fopen("opsnr.stt", "a");
1792 if (stats_file == NULL) {
1793 die("Cannot open opsnr.stt\n");
1794 }
1795#endif
1796#if CONFIG_AV1_DECODER
1798#endif
1799
1800 struct RateControlMetrics rc;
1801 int64_t cx_time = 0;
1804 double sum_bitrate = 0.0;
1805 double sum_bitrate2 = 0.0;
1806 double framerate = 30.0;
1807 int use_svc_control = 1;
1808 int set_err_resil_frame = 0;
1809 int test_changing_bitrate = 0;
1810 zero(rc.layer_target_bitrate);
1812 memset(&app_input, 0, sizeof(AppInput));
1813 memset(&svc_params, 0, sizeof(svc_params));
1814
1815
1816
1817 const int test_dynamic_scaling_single_layer = 0;
1818
1819
1820 const int test_speed_per_layer = 0;
1821
1822
1823 const int test_active_maps = 0;
1824
1825
1826 for (i = 0; i < MAX_NUM_SPATIAL_LAYERS; ++i) {
1827 app_input.input_ctx[i].framerate.numerator = 30;
1828 app_input.input_ctx[i].framerate.denominator = 1;
1829 app_input.input_ctx[i].only_i420 = 0;
1830 app_input.input_ctx[i].bit_depth =
AOM_BITS_8;
1831 }
1832 app_input.speed = 7;
1833 exec_name = argv[0];
1834
1835
1840 }
1841
1842
1844
1858
1859 parse_command_line(argc, argv, &app_input, &svc_params, &cfg);
1860
1863
1864 unsigned int width = cfg.
g_w;
1865 unsigned int height = cfg.
g_h;
1866
1867 if (app_input.layering_mode >= 0) {
1868 if (ts_number_layers !=
1869 mode_to_num_temporal_layers[app_input.layering_mode] ||
1870 ss_number_layers !=
1871 mode_to_num_spatial_layers[app_input.layering_mode]) {
1872 die("Number of layers doesn't match layering mode.");
1873 }
1874 }
1875
1876 bool has_non_y4m_input = false;
1878 if (app_input.input_ctx[i].file_type != FILE_TYPE_Y4M) {
1879 has_non_y4m_input = true;
1880 break;
1881 }
1882 }
1883
1884 if (has_non_y4m_input) {
1886 die("Failed to allocate image (%dx%d)", width, height);
1887 }
1888 }
1889
1891
1894
1895 unsigned int total_rate = 0;
1896 for (i = 0; i < ss_number_layers; i++) {
1897 total_rate +=
1898 svc_params
1900 }
1902 die("Incorrect total target bitrate, expected: %d", total_rate);
1903 }
1904
1906 if (ts_number_layers == 2) {
1909 } else if (ts_number_layers == 3) {
1913 }
1914
1915 libaom_examples::MultilayerMetadata multilayer_metadata;
1916 if (app_input.multilayer_metadata_file != NULL) {
1917 if (!libaom_examples::parse_multilayer_file(
1918 app_input.multilayer_metadata_file, &multilayer_metadata)) {
1919 die("Failed to parse multilayer metadata");
1920 }
1921 libaom_examples::print_multilayer_metadata(multilayer_metadata);
1922 }
1923
1925 set_rate_control_metrics(&rc, framerate, ss_number_layers, ts_number_layers);
1926
1927 AvxVideoInfo info;
1928 info.codec_fourcc = get_fourcc_by_aom_encoder(encoder);
1929 info.frame_width = cfg.
g_w;
1930 info.frame_height = cfg.
g_h;
1933
1934 for (int sl = 0; sl < ss_number_layers; ++sl) {
1935 for (int tl = 0; tl < ts_number_layers; ++tl) {
1936 i = sl * ts_number_layers + tl;
1937 char file_name[PATH_MAX];
1938 snprintf(file_name, sizeof(file_name), "%s_%d.av1",
1939 app_input.output_filename, i);
1940 if (app_input.output_obu) {
1941 obu_files[i] = fopen(file_name, "wb");
1942 if (!obu_files[i]) die("Failed to open %s for writing", file_name);
1943 } else {
1944 outfile[i] = aom_video_writer_open(file_name, kContainerIVF, &info);
1945 if (!outfile[i]) die("Failed to open %s for writing", file_name);
1946 }
1947 }
1948 }
1949 if (app_input.output_obu) {
1950 total_layer_obu_file = fopen(app_input.output_filename, "wb");
1951 if (!total_layer_obu_file)
1952 die("Failed to open %s for writing", app_input.output_filename);
1953 } else {
1954 total_layer_file =
1955 aom_video_writer_open(app_input.output_filename, kContainerIVF, &info);
1956 if (!total_layer_file)
1957 die("Failed to open %s for writing", app_input.output_filename);
1958 }
1959
1960
1966 die_codec(&codec, "Failed to initialize encoder");
1967
1968#if CONFIG_AV1_DECODER
1969 if (app_input.decode) {
1971 die_codec(&decoder, "Failed to initialize decoder");
1972 }
1973#endif
1974
1991
1992
1998
2000
2002 if (app_input.tune_content == AOM_CONTENT_SCREEN) {
2004
2006 }
2007
2008 if (app_input.use_external_rc) {
2010 }
2011
2013
2016
2018
2021 for (i = 0; i < ss_number_layers * ts_number_layers; ++i) {
2024 }
2025
2026
2027
2028
2029
2030
2031 if (!app_input.scale_factors_explicitly_set) {
2032 for (i = 0; i < ss_number_layers; ++i) {
2035 }
2036 if (ss_number_layers == 2) {
2039 } else if (ss_number_layers == 3) {
2044 }
2045 }
2047
2048
2049
2050
2051
2052 {
2053 const int max_intra_size_pct = 300;
2055 max_intra_size_pct);
2056 }
2057
2058 for (int lx = 0; lx < ts_number_layers * ss_number_layers; lx++) {
2059 cx_time_layer[lx] = 0;
2060 frame_cnt_layer[lx] = 0;
2061 }
2062
2063 std::unique_ptr<aom::AV1RateControlRTC> rc_api;
2064 if (app_input.use_external_rc) {
2065 const aom::AV1RateControlRtcConfig rc_cfg =
2066 create_rtc_rc_config(cfg, app_input);
2067 rc_api = aom::AV1RateControlRTC::Create(rc_cfg);
2068 }
2069
2070 frame_avail = 1;
2071 struct psnr_stats psnr_stream;
2072 memset(&psnr_stream, 0, sizeof(psnr_stream));
2073 while (frame_avail || got_data) {
2074 struct aom_usec_timer timer;
2075 frame_avail = read_frame(&(app_input.input_ctx[0]), &raw);
2076
2077 for (int slx = 0; slx < ss_number_layers; slx++) {
2078 if (slx > 0 && app_input.input_ctx[slx].filename != NULL) {
2079 const int previous_layer_frame_avail = frame_avail;
2080 frame_avail = read_frame(&(app_input.input_ctx[slx]), &raw);
2081 if (previous_layer_frame_avail != frame_avail) {
2082 die("Mismatch in number of frames between spatial layer input files");
2083 }
2084 }
2085
2088 int reference_updated = 0;
2089 int layer = 0;
2090
2091 int is_key_frame = (frame_cnt % cfg.
kf_max_dist) == 0;
2092
2093 if (app_input.layering_mode >= 0) {
2094
2095
2096 set_layer_pattern(app_input.layering_mode, frame_cnt, &layer_id,
2097 &ref_frame_config, &ref_frame_comp_pred,
2098 &use_svc_control, slx, is_key_frame,
2099 (app_input.layering_mode == 10), app_input.speed,
2100 &reference_updated);
2102 if (use_svc_control) {
2104 &ref_frame_config);
2106 &ref_frame_comp_pred);
2107 }
2108 if (app_input.multilayer_metadata_file != NULL) {
2109 add_multilayer_metadata(&raw, multilayer_metadata, frame_cnt, slx);
2110 }
2111
2112 if (test_speed_per_layer) {
2113 int speed_per_layer = 10;
2126 }
2128 }
2129 } else {
2130
2131
2132
2135 if (ts_number_layers == 2) {
2137 } else if (ts_number_layers == 3) {
2138 if (frame_cnt % 2 != 0)
2140 else if ((frame_cnt > 1) && ((frame_cnt - 2) % 4 == 0))
2142 }
2144 }
2145
2147
2148
2149
2150
2151
2152
2153
2154 const int err_resil_mode =
2157 err_resil_mode);
2158 }
2159
2161 if (frame_avail && slx == 0) ++rc.layer_input_frames[layer];
2162
2163 if (test_dynamic_scaling_single_layer) {
2164
2165
2166 int frame_2x2 = 200;
2167 int frame_4x4 = 400;
2168 int frame_2x2up = 600;
2169 int frame_orig = 800;
2170 if (frame_cnt >= frame_2x2 && frame_cnt < frame_4x4) {
2171
2174 } else if (frame_cnt >= frame_4x4 && frame_cnt < frame_2x2up) {
2175
2178 } else if (frame_cnt >= frame_2x2up && frame_cnt < frame_orig) {
2179
2182 } else if (frame_cnt >= frame_orig) {
2183
2186 }
2187 if (frame_cnt == frame_2x2 || frame_cnt == frame_4x4 ||
2188 frame_cnt == frame_2x2up || frame_cnt == frame_orig) {
2189
2190
2191
2192
2193
2194 for (i = 0; i < REF_FRAMES; i++) ref_frame_config.
refresh[i] = 1;
2195 if (use_svc_control) {
2197 &ref_frame_config);
2199 &ref_frame_comp_pred);
2200 }
2201 }
2202 }
2203
2204
2205 if (test_changing_bitrate && frame_cnt % 2 == 0) {
2206 if (frame_cnt < 500)
2208 else
2210
2214
2215
2218 die_codec(&codec, "Failed to SET_BITRATE_ONE_PASS_CBR");
2219 }
2220
2221 if (rc_api) {
2222 aom::AV1FrameParamsRTC frame_params;
2223
2224 frame_params.spatial_layer_id = 0;
2225 frame_params.temporal_layer_id = 0;
2226 frame_params.frame_type =
2227 is_key_frame ? aom::kKeyFrame : aom::kInterFrame;
2228 rc_api->ComputeQP(frame_params);
2229 const int current_qp = rc_api->GetQP();
2231 qindex_to_quantizer(current_qp))) {
2232 die_codec(&codec, "Failed to SET_QUANTIZER_ONE_PASS");
2233 }
2234 }
2235
2236 if (test_active_maps) set_active_map(&cfg, &codec, frame_cnt);
2237
2238
2239 aom_usec_timer_start(&timer);
2241 die_codec(&codec, "Failed to encode frame");
2242 aom_usec_timer_mark(&timer);
2243 cx_time += aom_usec_timer_elapsed(&timer);
2244 cx_time_layer[layer] += aom_usec_timer_elapsed(&timer);
2245 frame_cnt_layer[layer] += 1;
2246
2247
2248 int content_flag = 0;
2250 &content_flag)) {
2251 die_codec(&codec, "Failed to GET_HIGH_MOTION_CONTENT_SCREEN_RTC");
2252 }
2253
2254 got_data = 0;
2255
2256 int ss_layers_write = (app_input.layering_mode == 11)
2258 : ss_number_layers;
2260 switch (pkt->
kind) {
2263 ++sl) {
2265 ++tl) {
2266 int j = sl * ts_number_layers + tl;
2267 if (app_input.output_obu) {
2269 obu_files[j]);
2270 } else {
2271 aom_video_writer_write_frame(
2272 outfile[j],
2273 reinterpret_cast<const uint8_t *
>(pkt->
data.
frame.
buf),
2275 }
2277 rc.layer_encoding_bitrate[j] += 8.0 * pkt->
data.
frame.
sz;
2278 }
2279 }
2280 got_data = 1;
2281
2282 if (app_input.output_obu) {
2284 total_layer_obu_file);
2285 } else {
2286 aom_video_writer_write_frame(
2287 total_layer_file,
2288 reinterpret_cast<const uint8_t *
>(pkt->
data.
frame.
buf),
2290 }
2291
2295 assert(j >= 0);
2296 rc.layer_avg_frame_size[j] += 8.0 * pkt->
data.
frame.
sz;
2297 rc.layer_avg_rate_mismatch[j] +=
2298 fabs(8.0 * pkt->
data.
frame.
sz - rc.layer_pfb[j]) /
2299 rc.layer_pfb[j];
2301 }
2302
2303 if (rc_api) {
2305 }
2306
2307
2308
2309
2310 if (frame_cnt > rc.window_size && slx == ss_number_layers - 1) {
2311 sum_bitrate += 0.001 * 8.0 * pkt->
data.
frame.
sz * framerate;
2312 rc.window_size = (rc.window_size <= 0) ? 1 : rc.window_size;
2313 if (frame_cnt % rc.window_size == 0) {
2314 rc.window_count += 1;
2315 rc.avg_st_encoding_bitrate += sum_bitrate / rc.window_size;
2316 rc.variance_st_encoding_bitrate +=
2317 (sum_bitrate / rc.window_size) *
2318 (sum_bitrate / rc.window_size);
2319 sum_bitrate = 0.0;
2320 }
2321 }
2322
2323 if (frame_cnt > rc.window_size + rc.window_size / 2 &&
2324 slx == ss_number_layers - 1) {
2325 sum_bitrate2 += 0.001 * 8.0 * pkt->
data.
frame.
sz * framerate;
2326 if (frame_cnt > 2 * rc.window_size &&
2327 frame_cnt % rc.window_size == 0) {
2328 rc.window_count += 1;
2329 rc.avg_st_encoding_bitrate += sum_bitrate2 / rc.window_size;
2330 rc.variance_st_encoding_bitrate +=
2331 (sum_bitrate2 / rc.window_size) *
2332 (sum_bitrate2 / rc.window_size);
2333 sum_bitrate2 = 0.0;
2334 }
2335 }
2336
2337#if CONFIG_AV1_DECODER
2338 if (app_input.decode) {
2340 &decoder,
2341 reinterpret_cast<const uint8_t *
>(pkt->
data.
frame.
buf),
2343 die_codec(&decoder, "Failed to decode frame");
2344 }
2345#endif
2346
2347 break;
2349 if (app_input.show_psnr) {
2350 psnr_stream.psnr_sse_total[0] += pkt->
data.
psnr.sse[0];
2351 psnr_stream.psnr_samples_total[0] += pkt->
data.
psnr.samples[0];
2352 for (int plane = 0; plane < 4; plane++) {
2353 psnr_stream.psnr_totals[0][plane] += pkt->
data.
psnr.psnr[plane];
2354 }
2355 psnr_stream.psnr_count[0]++;
2356 }
2357 break;
2358 default: break;
2359 }
2360 }
2361#if CONFIG_AV1_DECODER
2362 if (got_data && app_input.decode) {
2363
2364 if (reference_updated) {
2365 if (test_decode(&codec, &decoder, frame_cnt)) {
2366#if CONFIG_INTERNAL_STATS
2367 fprintf(stats_file, "First mismatch occurred in frame %d\n",
2368 frame_cnt);
2369 fclose(stats_file);
2370#endif
2371 fatal("Mismatch seen");
2372 }
2373 }
2374 }
2375#endif
2376 }
2377 ++frame_cnt;
2378 pts += frame_duration;
2379 }
2380
2381 for (i = 0; i < MAX_NUM_SPATIAL_LAYERS; ++i) {
2382 if (app_input.input_ctx[i].filename == NULL) {
2383 break;
2384 }
2385 close_input_file(&(app_input.input_ctx[i]));
2386 }
2387 printout_rate_control_summary(&rc, frame_cnt, ss_number_layers,
2388 ts_number_layers);
2389
2390 printf("\n");
2391 for (int slx = 0; slx < ss_number_layers; slx++)
2392 for (int tlx = 0; tlx < ts_number_layers; tlx++) {
2393 int lx = slx * ts_number_layers + tlx;
2394 printf("Per layer encoding time/FPS stats for encoder: %d %d %d %f %f \n",
2395 slx, tlx, frame_cnt_layer[lx],
2396 (float)cx_time_layer[lx] / (double)(frame_cnt_layer[lx] * 1000),
2397 1000000 * (double)frame_cnt_layer[lx] / (double)cx_time_layer[lx]);
2398 }
2399
2400 printf("\n");
2401 printf("Frame cnt and encoding time/FPS stats for encoding: %d %f %f\n",
2402 frame_cnt, 1000 * (float)cx_time / (double)(frame_cnt * 1000000),
2403 1000000 * (double)frame_cnt / (double)cx_time);
2404
2405 if (app_input.show_psnr) {
2406 show_psnr(&psnr_stream, 255.0);
2407 }
2408
2410
2411#if CONFIG_AV1_DECODER
2412 if (app_input.decode) {
2414 die_codec(&decoder, "Failed to destroy decoder");
2415 }
2416#endif
2417
2418#if CONFIG_INTERNAL_STATS
2419 fprintf(stats_file, "No mismatch detected in recon buffers\n");
2420 fclose(stats_file);
2421#endif
2422
2423
2424 for (i = 0; i < ss_number_layers * ts_number_layers; ++i)
2425 aom_video_writer_close(outfile[i]);
2426 aom_video_writer_close(total_layer_file);
2427
2428 if (has_non_y4m_input) {
2430 }
2431 return EXIT_SUCCESS;
2432}
Describes the decoder algorithm interface to applications.
Describes the encoder algorithm interface to applications.
Describes the aom image descriptor and associated operations.
@ AOM_MIF_KEY_FRAME
Definition aom_image.h:176
@ AOM_MIF_ANY_FRAME_LAYER_SPECIFIC
Definition aom_image.h:183
@ AOM_CSP_UNKNOWN
Definition aom_image.h:143
enum aom_chroma_sample_position aom_chroma_sample_position_t
List of chroma sample positions.
#define AOM_IMG_FMT_HIGHBITDEPTH
Definition aom_image.h:38
aom_image_t * aom_img_alloc(aom_image_t *img, aom_img_fmt_t fmt, unsigned int d_w, unsigned int d_h, unsigned int align)
Open a descriptor, allocating storage for the underlying image.
@ AOM_IMG_FMT_I420
Definition aom_image.h:45
enum aom_img_fmt aom_img_fmt_t
List of supported image formats.
int aom_img_add_metadata(aom_image_t *img, uint32_t type, const uint8_t *data, size_t sz, aom_metadata_insert_flags_t insert_flag)
Add metadata to image.
struct aom_image aom_image_t
Image Descriptor.
void aom_img_free(aom_image_t *img)
Close an image descriptor.
Provides definitions for using AOM or AV1 encoder algorithm within the aom Codec Interface.
#define AOM_MAX_LAYERS
Definition aomcx.h:1738
struct aom_svc_params aom_svc_params_t
Parameter type for SVC.
#define AOM_MAX_TS_LAYERS
Definition aomcx.h:1740
aom_codec_iface_t * aom_codec_av1_cx(void)
The interface to the AV1 encoder.
struct aom_svc_layer_id aom_svc_layer_id_t
Struct for spatial and temporal layer ID.
struct aom_active_map aom_active_map_t
aom active region map
struct aom_svc_ref_frame_comp_pred aom_svc_ref_frame_comp_pred_t
Parameters for setting ref frame compound prediction.
struct aom_svc_ref_frame_config aom_svc_ref_frame_config_t
Parameters for setting ref frame config.
@ AOM_FULL_SUPERFRAME_DROP
Definition aomcx.h:1812
@ AV1E_SET_BITRATE_ONE_PASS_CBR
Codec control to set the target bitrate in kilobits per second, unsigned int parameter....
Definition aomcx.h:1540
@ AV1E_SET_ENABLE_SMOOTH_INTRA
Codec control function to turn on / off smooth intra modes usage, int parameter.
Definition aomcx.h:1081
@ AV1E_SET_ENABLE_TPL_MODEL
Codec control function to enable RDO modulated by frame temporal dependency, unsigned int parameter.
Definition aomcx.h:418
@ AV1E_SET_AQ_MODE
Codec control function to set adaptive quantization mode, unsigned int parameter.
Definition aomcx.h:478
@ AV1E_SET_SVC_LAYER_ID
Codec control function to set the layer id, aom_svc_layer_id_t* parameter.
Definition aomcx.h:1289
@ AV1E_SET_SVC_REF_FRAME_CONFIG
Codec control function to set the reference frame config, aom_svc_ref_frame_config_t* parameter.
Definition aomcx.h:1299
@ AV1E_SET_TUNE_CONTENT
Codec control function to set content type, aom_tune_content parameter.
Definition aomcx.h:507
@ AV1E_SET_CDF_UPDATE_MODE
Codec control function to set CDF update mode, unsigned int parameter.
Definition aomcx.h:516
@ AV1E_SET_ENABLE_ANGLE_DELTA
Codec control function to turn on/off intra angle delta, int parameter.
Definition aomcx.h:1128
@ AV1E_SET_MV_COST_UPD_FREQ
Control to set frequency of the cost updates for motion vectors, unsigned int parameter.
Definition aomcx.h:1267
@ AV1E_SET_INTRA_DEFAULT_TX_ONLY
Control to use default tx type only for intra modes, int parameter.
Definition aomcx.h:1216
@ AV1E_SET_SVC_REF_FRAME_COMP_PRED
Codec control function to set reference frame compound prediction. aom_svc_ref_frame_comp_pred_t* par...
Definition aomcx.h:1404
@ AV1E_SET_ENABLE_INTRABC
Codec control function to turn on/off intra block copy mode, int parameter.
Definition aomcx.h:1124
@ AV1E_SET_ENABLE_WARPED_MOTION
Codec control function to turn on / off warped motion usage at sequence level, int parameter.
Definition aomcx.h:1049
@ AV1E_SET_RTC_EXTERNAL_RC
Codec control function to set flag for rate control used by external encoders.
Definition aomcx.h:1439
@ AV1E_SET_COEFF_COST_UPD_FREQ
Control to set frequency of the cost updates for coefficients, unsigned int parameter.
Definition aomcx.h:1247
@ AV1E_SET_ENABLE_CDEF
Codec control function to encode with CDEF, unsigned int parameter.
Definition aomcx.h:681
@ AOME_SET_ACTIVEMAP
Codec control function to pass an Active map to encoder, aom_active_map_t* parameter.
Definition aomcx.h:190
@ AV1E_SET_DV_COST_UPD_FREQ
Control to set frequency of the cost updates for intrabc motion vectors, unsigned int parameter.
Definition aomcx.h:1370
@ AV1E_SET_SVC_FRAME_DROP_MODE
Codec control to set the frame drop mode for SVC, unsigned int parameter. The valid values are consta...
Definition aomcx.h:1553
@ AV1E_SET_SVC_PARAMS
Codec control function to set SVC parameters, aom_svc_params_t* parameter.
Definition aomcx.h:1294
@ AV1E_SET_ENABLE_FILTER_INTRA
Codec control function to turn on / off filter intra usage at sequence level, int parameter.
Definition aomcx.h:1070
@ AV1E_SET_ENABLE_PALETTE
Codec control function to turn on/off palette mode, int parameter.
Definition aomcx.h:1120
@ AV1E_SET_ENABLE_CFL_INTRA
Codec control function to turn on / off CFL uv intra mode usage, int parameter.
Definition aomcx.h:1099
@ AOME_SET_MAX_INTRA_BITRATE_PCT
Codec control function to set max data rate for intra frames, unsigned int parameter.
Definition aomcx.h:312
@ AV1E_SET_ERROR_RESILIENT_MODE
Codec control function to enable error_resilient_mode, int parameter.
Definition aomcx.h:452
@ AV1E_SET_ENABLE_OBMC
Codec control function to predict with OBMC mode, unsigned int parameter.
Definition aomcx.h:708
@ AV1E_SET_AUTO_TILES
Codec control to set auto tiling, unsigned int parameter. Value of 1 means encoder will set number of...
Definition aomcx.h:1561
@ AV1E_SET_LOOPFILTER_CONTROL
Codec control to control loop filter.
Definition aomcx.h:1419
@ AOME_SET_SCALEMODE
Codec control function to set encoder scaling mode for the next frame to be coded,...
Definition aomcx.h:197
@ AV1E_SET_ENABLE_ORDER_HINT
Codec control function to turn on / off frame order hint (int parameter). Affects: joint compound mod...
Definition aomcx.h:876
@ AV1E_SET_DELTAQ_MODE
Codec control function to set the delta q mode, unsigned int parameter.
Definition aomcx.h:1144
@ AV1E_SET_POSTENCODE_DROP_RTC
Codec control to enable post encode frame drop for RTC encoding, int parameter.
Definition aomcx.h:1577
@ AV1E_SET_ENABLE_GLOBAL_MOTION
Codec control function to turn on / off global motion usage for a sequence, int parameter.
Definition aomcx.h:1039
@ AOME_SET_CPUUSED
Codec control function to set encoder internal speed settings, int parameter.
Definition aomcx.h:220
@ AV1E_GET_HIGH_MOTION_CONTENT_SCREEN_RTC
Codec control to get the high motion content flag, used for screen content realtime (RTC) encoding,...
Definition aomcx.h:1568
@ AV1E_SET_GF_CBR_BOOST_PCT
Boost percentage for Golden Frame in CBR mode, unsigned int parameter.
Definition aomcx.h:349
@ AV1E_SET_QUANTIZER_ONE_PASS
Codec control to set quantizer for the next frame, int parameter.
Definition aomcx.h:1502
@ AV1E_SET_MODE_COST_UPD_FREQ
Control to set frequency of the cost updates for mode, unsigned int parameter.
Definition aomcx.h:1257
@ AV1E_SET_MAX_CONSEC_FRAME_DROP_MS_CBR
Codec control to set the maximum number of consecutive frame drops, in units of time (milliseconds),...
Definition aomcx.h:1583
@ AV1_GET_NEW_FRAME_IMAGE
Codec control function to get a pointer to the new frame.
Definition aom.h:70
const char * aom_codec_iface_name(aom_codec_iface_t *iface)
Return the name for a given interface.
enum aom_bit_depth aom_bit_depth_t
Bit depth for codecThis enumeration determines the bit depth of the codec.
aom_codec_err_t aom_codec_control(aom_codec_ctx_t *ctx, int ctrl_id,...)
Algorithm Control.
long aom_codec_flags_t
Initialization-time Feature Enabling.
Definition aom_codec.h:232
struct aom_codec_ctx aom_codec_ctx_t
Codec context structure.
const struct aom_codec_iface aom_codec_iface_t
Codec interface structure.
Definition aom_codec.h:271
aom_codec_err_t aom_codec_destroy(aom_codec_ctx_t *ctx)
Destroy a codec instance.
const char * aom_codec_err_to_string(aom_codec_err_t err)
Convert error number to printable string.
aom_codec_err_t
Algorithm return codes.
Definition aom_codec.h:155
#define AOM_CODEC_CONTROL_TYPECHECKED(ctx, id, data)
aom_codec_control wrapper macro (adds type-checking, less flexible)
Definition aom_codec.h:542
const void * aom_codec_iter_t
Iterator.
Definition aom_codec.h:305
#define AOM_FRAME_IS_KEY
Definition aom_codec.h:288
@ AOM_BITS_8
Definition aom_codec.h:336
@ AOM_BITS_10
Definition aom_codec.h:337
@ AOM_CODEC_INVALID_PARAM
An application-supplied parameter is not valid.
Definition aom_codec.h:200
@ AOM_CODEC_MEM_ERROR
Memory operation failed.
Definition aom_codec.h:163
@ AOM_CODEC_OK
Operation completed without error.
Definition aom_codec.h:157
aom_codec_err_t aom_codec_decode(aom_codec_ctx_t *ctx, const uint8_t *data, size_t data_sz, void *user_priv)
Decode data.
#define aom_codec_dec_init(ctx, iface, cfg, flags)
Convenience macro for aom_codec_dec_init_ver()
Definition aom_decoder.h:129
const aom_codec_cx_pkt_t * aom_codec_get_cx_data(aom_codec_ctx_t *ctx, aom_codec_iter_t *iter)
Encoded data iterator.
struct aom_codec_cx_pkt aom_codec_cx_pkt_t
Encoder output packet.
aom_codec_err_t aom_codec_encode(aom_codec_ctx_t *ctx, const aom_image_t *img, aom_codec_pts_t pts, unsigned long duration, aom_enc_frame_flags_t flags)
Encode a frame.
#define aom_codec_enc_init(ctx, iface, cfg, flags)
Convenience macro for aom_codec_enc_init_ver()
Definition aom_encoder.h:943
aom_codec_err_t aom_codec_enc_config_default(aom_codec_iface_t *iface, aom_codec_enc_cfg_t *cfg, unsigned int usage)
Get the default configuration for a usage.
struct aom_codec_enc_cfg aom_codec_enc_cfg_t
Encoder configuration structure.
#define AOM_USAGE_REALTIME
usage parameter analogous to AV1 REALTIME mode.
Definition aom_encoder.h:1016
#define AOM_CODEC_USE_HIGHBITDEPTH
Definition aom_encoder.h:80
#define AOM_CODEC_USE_PSNR
Initialization-time Feature Enabling.
Definition aom_encoder.h:79
@ AOM_CBR
Definition aom_encoder.h:187
@ AOM_KF_AUTO
Definition aom_encoder.h:202
@ AOM_CODEC_PSNR_PKT
Definition aom_encoder.h:113
@ AOM_CODEC_CX_FRAME_PKT
Definition aom_encoder.h:110
unsigned int rows
Definition aomcx.h:1649
unsigned int cols
Definition aomcx.h:1650
unsigned char * active_map
specify an on (1) or off (0) each 16x16 region within a frame
Definition aomcx.h:1648
size_t sz
Definition aom_encoder.h:127
enum aom_codec_cx_pkt_kind kind
Definition aom_encoder.h:123
double psnr[4]
Definition aom_encoder.h:145
union aom_codec_cx_pkt::@202210014045072156205127107315337341215221351166 data
aom_codec_frame_flags_t flags
Definition aom_encoder.h:132
struct aom_codec_cx_pkt::@202210014045072156205127107315337341215221351166::@052232317104146204273007241322037340334334344046 frame
void * buf
Definition aom_encoder.h:126
unsigned int g_input_bit_depth
Bit-depth of the input frames.
Definition aom_encoder.h:475
unsigned int rc_dropframe_thresh
Temporal resampling configuration, if supported by the codec.
Definition aom_encoder.h:540
struct aom_rational g_timebase
Stream timebase units.
Definition aom_encoder.h:489
unsigned int g_usage
Algorithm specific "usage" value.
Definition aom_encoder.h:399
unsigned int rc_buf_sz
Decoder Buffer Size.
Definition aom_encoder.h:705
unsigned int g_h
Height of the frame.
Definition aom_encoder.h:435
enum aom_kf_mode kf_mode
Keyframe placement mode.
Definition aom_encoder.h:768
enum aom_rc_mode rc_end_usage
Rate control algorithm to use.
Definition aom_encoder.h:623
unsigned int g_threads
Maximum number of threads to use.
Definition aom_encoder.h:407
unsigned int kf_min_dist
Keyframe minimum interval.
Definition aom_encoder.h:777
unsigned int g_lag_in_frames
Allow lagged encoding.
Definition aom_encoder.h:518
unsigned int rc_buf_initial_sz
Decoder Buffer Initial Size.
Definition aom_encoder.h:714
unsigned int g_profile
Bitstream profile to use.
Definition aom_encoder.h:417
aom_bit_depth_t g_bit_depth
Bit-depth of the codec.
Definition aom_encoder.h:467
unsigned int g_w
Width of the frame.
Definition aom_encoder.h:426
unsigned int rc_undershoot_pct
Rate control adaptation undershoot control.
Definition aom_encoder.h:681
unsigned int kf_max_dist
Keyframe maximum interval.
Definition aom_encoder.h:786
aom_codec_er_flags_t g_error_resilient
Enable error resilient modes.
Definition aom_encoder.h:497
unsigned int rc_max_quantizer
Maximum (Worst Quality) Quantizer.
Definition aom_encoder.h:668
unsigned int rc_buf_optimal_sz
Decoder Buffer Optimal Size.
Definition aom_encoder.h:723
unsigned int rc_min_quantizer
Minimum (Best Quality) Quantizer.
Definition aom_encoder.h:658
unsigned int rc_target_bitrate
Target data rate.
Definition aom_encoder.h:644
unsigned int rc_resize_mode
Mode for spatial resampling, if supported by the codec.
Definition aom_encoder.h:549
unsigned int rc_overshoot_pct
Rate control adaptation overshoot control.
Definition aom_encoder.h:690
aom_img_fmt_t fmt
Definition aom_image.h:199
unsigned int d_w
Definition aom_image.h:213
unsigned int d_h
Definition aom_image.h:214
int num
Definition aom_encoder.h:165
int den
Definition aom_encoder.h:166
aom image scaling mode
Definition aomcx.h:1658
int temporal_layer_id
Definition aomcx.h:1745
int spatial_layer_id
Definition aomcx.h:1744
int max_quantizers[32]
Definition aomcx.h:1769
int number_spatial_layers
Definition aomcx.h:1761
int layer_target_bitrate[32]
Definition aomcx.h:1774
int framerate_factor[8]
Definition aomcx.h:1776
int min_quantizers[32]
Definition aomcx.h:1770
int scaling_factor_den[4]
Definition aomcx.h:1772
int number_temporal_layers
Definition aomcx.h:1768
int scaling_factor_num[4]
Definition aomcx.h:1771
int use_comp_pred[3]
Definition aomcx.h:1806
int reference[7]
Definition aomcx.h:1796
int refresh[8]
Definition aomcx.h:1799
int ref_idx[7]
Definition aomcx.h:1798